// ( o14.C ) // メッセ−ジ通信とデ−タベ−ス−その1 // /* 点がX軸上に並んでいる。点の間隔は8以上なければならない。ある点を移動した時に、 自動的にそのル−ルに従うよう、他の点の場所を移動させる。 10 20 30 40 a b c d 最初の状態 ↓ a b c d c を 25 に移動 c は調整の対象から外す ↓ a b c d b を調整、17に移動 b は調整の対象から外す ↓ 9 a 17 b 25 c 40 d a を調整、9に移動 a は調整の対象から外す ↓ 調整する対象がなくなったので終了 */ #include #include "math.h" // abs use class Point { int x ; public: Point( int xx ) { x = xx ; } void display() { cout << "Point : " << x << endl ; } int get_x() { return x ; } void move( int mx ) { x = mx ; } } ; class DB { // デ−タベ−スだけを定義するクラス static int count ; static Point* a[5] ; public: DB() { count = 0 ; } void add_Point( Point* p ) { a[count] = p ; count++ ; } void report() { for ( int i=0;idisplay() ; } int get_count() { return count ; } Point* get_Point( int i ) { return a[i] ; } } ; class Access { // デ−タベ−スをアクセスするためのクラス DB* db ; public: // 点の間隔は8以上というル−ルを、ここで管 Access( DB* b ) { db = b ; } // 理している。点自身が管理することも考えら void report() { db->report() ; } // れが、その方がよりオブジェクト指向らしか。 void move_object( Point* p ) { int max = db->get_count() ; int position = p->get_x() ; for ( int i=0;iget_Point(i) ; if ( p == a ) continue ; int interval = abs( a->get_x() - position ) ; if ( interval < 8 ) { if ( (a->get_x() - position) < 0 ) a->move( position-8 ) ; move_object( a ) ; // 次のオブジェクトに制御を移すことになる break ; } } }} ; // 行数が足らないので、こうしただけ main() { Point* a = new Point( 10 ) ; DB db ; db.add_Point( a ) ; Point* b = new Point( 20 ) ; db.add_Point( b ) ; Point* c = new Point( 30 ) ; db.add_Point( c ) ; Point* d = new Point( 40 ) ; db.add_Point( d ) ; db.report() ; c->move( 25 ) ; // c を25に移動する Access adb( &db ) ; adb.move_object( c ) ; adb.report() ; // c を移動しましたと知らせる }